package com.concurrent.base;

/**
 * @ClassName: VolatileTest
 * @Description: volatile关键字
 * @author: li
 * @Date: 2021/8/24 9:43 下午
 */
public class VolatileTest extends Thread {
    /**
     * 在flag前面加上volatile关键字，强制线程每次读取该值的时候都去“主内存”中取值，而不是从自己的工作内存中去取
     * volatile不保证原子性。所以只能做一些原子操作（例如赋值，取值），无法进行自增，自减等非原子操作
     * 当将变量修饰为final时，所有的线程都共享此变量
     */
    volatile boolean flag = false;
    int i = 0;

    @Override
    public void run() {
        while (!flag) {
            i++;
        }
    }

    public static void main(String[] args) throws Exception {
        VolatileTest vt = new VolatileTest();
        vt.start();
        Thread.sleep(2000);
        vt.flag = true;
        System.out.println("stope" + vt.i);
    }
}